Chunk Processor
前提
n: 処理中の最初のブロックヘッダのブロック番号
r: 1つのチャンクで処理されるブロックヘッダの数
n-r+1: 最後に処理されたブロックヘッダのブロック番号
H(k): ブロックヘッダkのハッシュ
PH(k): ブロックヘッダ k の親のハッシュ
つまりPH(k) = H(k-1)と表すことができる
つまり、Chunk Processorを1回実行すると、nからn-r+1までのブロックヘッダを処理し、合計r個のブロックヘッダを処理することになる
ここでは[n-r+1, n]を処理されるブロックヘッダの範囲とする
Processorの2つの役割
ブロックヘッダNからブロックヘッダN-R+1の証明
Processorは、以下のデータをプライベートな入力として受け取る
n
n-r+1
PH(n+1)
処理中の最初のブロックヘッダの親ハッシュ
ブロック番号[n-r+1, n]のブロックヘッダ
各ブロックヘッダのbyte size
1つ前のMMRのroot hash
1つ前のMMRのlength
1つ前のMMRのルートハッシュにつながる前のMMRのpeak
以下のデータを出力する
n
n-r+1
ブロックヘッダから抽出される
PH(n+1)
PH(n-r+1)
n-r+1のブロックヘッダから抽出する
1つ前のMMRのroot hash
1つ前のMMRのlength
新しいMMRのroot hash
新しいMMRのlength
Sample output
code:sample.json
{
"from_block_number_high": 15000,
"to_block_number_low": 13363,
"block_n_plus_one_parent_hash_low": 154290822937787733774056680842541373608,
"block_n_plus_one_parent_hash_high": 156853552136708155686345135791644162539,
"block_n_minus_r_plus_one_parent_hash_low": 281371821923349311514485903736664824394,
"block_n_minus_r_plus_one_parent_hash_high": 23750595297014185889703423987183304060,
"mmr_last_root_poseidon": 2921600461849179232597610084551483949436449163481908169507355734771418934190,
"mmr_last_root_keccak_low": 255731995079421981708054171413297402747,
"mmr_last_root_keccak_high": 124351033810760994347164128898134164945,
"mmr_last_len": 1,
"new_mmr_root_poseidon": 366537929573550773164043174537178174908470791275974636779493804144457621821,
"new_mmr_root_keccak_low": 155207974490154382400874803233698222316,
"new_mmr_root_keccak_high": 18856215989401494535507531263318176723,
"new_mmr_len": 3271
}
ブロックヘッダNからブロックヘッダN - R + 1の証明
入力して提供されたPH(n+1)が正しいと仮定すればH(n)==PH(n+1)は正しい
RLPの規則に従って、ブロックヘッダの親ハッシュを決定論的に取り出すことができる
この再帰を続けてPH(n)を取り出し、H(n-1)==PH(n)であることを主張する
これにより、入力として与えられたブロックヘッダ[n-r+1, n-r]のデータの完全性が保証される
したがって、すべての[H[n],H[n-1], ..., H[n-r+1]]をアキュムレータに格納することができる
PH(n-r+1)は、次のチャンクのための新しいPH(n+1)として使用できるように、抽出されて出力として返却される
真のn-r+1が最後のブロックヘッダから抽出され、出力として返却される
これは入力として提供されたn-r+1に対してアサートされ、処理されたブロック数がn - (n-r+1) + 1 = rであったので、入力として提供されたnは正しいと推論され、出力として返却することができる
これは最初のPH(n+1)が正しければ再帰的に証明できるという意味tomo.icon
ブロックヘッダのハッシュをMMRに格納する
MMRの1つ前のroot hashと入力として提供された1つ前のpeakを使用すれば提供されたperkが本当にツリーのrootと一致することを検証できる
そうであれば、前のMMRのpeakを使用して値を追加するだけ良い
MMRは値の追加時や子peakのマージの際にインデックスを使用しない
参考資料